"""
@Author : 合肥一元数智教育科技有限公司
@Date :  2025/10/30 13:45
@Description :  多态

多态: 同一个方法作用在不同的对象上, 会表现出不同的结果
分类:
  1. 参数多态
  2. 类型的多态   以继承为基础的
"""


# 输入动物的类型   输出动物的叫声
def make_sound(animal):
    if animal == 'dog':
        print('汪汪')
    elif animal == 'cat':
        print('喵喵')
    else:
        print('?')


# 调用函数
make_sound('dog')
make_sound('cat')
"""
  1. make_sound 初始时没有duck类型的逻辑分支 不能完成对应的效果
  2. 修改函数的实现逻辑  后续遇到没有对应分支的动物 均需要修改源代码
  3. 通过修改源代码实现业务  违背了代码编写的开闭原则    提升代码的可扩展性 
  4. 可以通过多态的思路优化函数的设计  函数具有通用性 

"""
make_sound('duck')

from abc import ABC, abstractmethod


#  通过面向对象多态的思路优化函数的创建

class Animal(ABC):
    @abstractmethod
    def talk(self):
        pass


#  继承   Dog     Animal
class Dog(Animal):
    def talk(self):
        print('汪汪')


class Cat(Animal):
    def talk(self):
        print('喵喵')


class Duck(Animal):
    def talk(self):
        print('嘎嘎')


class Person:
    def talk(self):
        print('person 讲中文')


def new_make_sound(animal: Animal):
    animal.talk()


# 调用函数
new_make_sound(Dog())
new_make_sound(Cat())
new_make_sound(Duck())

# new_make_sound(Person())

dog = Dog()
print(f'dog type Dog {isinstance(dog, Dog)}')
print(f'dog type Animal {isinstance(dog, Animal)}')
cat = Cat()
print(f'cat type is Dog {isinstance(cat, Dog)}')
